package logic

import (
	"encoding/json"
	"iris/db"
	"iris/server"

	"github.com/gomodule/redigo/redis"
	"github.com/tidwall/gjson"
)

// 发送短信
func SendSms(post map[string][]string) interface{} {

	httpData := make(map[string]string)

	// 手机号
	if post["phoneNum"] == nil || len(post["phoneNum"][0]) == 0 {
		return server.ResponseErr(6000)
	}

	// 模版ID
	if post["tpl"] == nil || len(post["tpl"][0]) == 0 {
		return server.ResponseErr(6000)
	}
	// 目前只有1.2.3.4个模版
	if post["tpl"][0] != "1" && post["tpl"][0] != "2" && post["tpl"][0] != "3" && post["tpl"][0] != "4" {
		return server.ResponseErr(6000)
	}

	// 接收数据
	httpData["phoneNum"] = post["phoneNum"][0]
	httpData["tpl"] = post["tpl"][0]

	// 配置文件名
	systemInfo := "system.json"
	// 获取配置信息
	system := server.GetFile(systemInfo)
	// redis前缀
	redis_prefix := gjson.Get(system, "core.redis_prefix").String()

	// 限制每50秒只能发送一次
	redis_sms_limit_key := redis_prefix + "_sms_limit_" + httpData["tpl"] + "_" + httpData["phoneNum"]
	redigo := db.Redis()
	redisSms, _ := redigo.Do("Get", redis_sms_limit_key)
	redisSmsStr, _ := redis.String(redisSms, nil)

	if len(redisSmsStr) > 0 {
		return server.ResponseErr(8000)
	}

	// 记录发送手机号
	redigo.Do("SET", redis_sms_limit_key, httpData["phoneNum"])
	redigo.Do("EXPIRE", redis_sms_limit_key, 50)

	// 发送短信
	sendMesRes, sendCode := server.SendMes(httpData)

	resCode := gjson.Get(sendMesRes, "body.Code").String()

	if resCode != "OK" {
		return server.ResponseErr(8001)
	}

	// 缓存验证码
	redis_sms_key := redis_prefix + "_sms_tpl_" + httpData["tpl"] + "_" + httpData["phoneNum"]
	redigo.Do("SET", redis_sms_key, sendCode)
	// 验证码有效期300秒
	redigo.Do("EXPIRE", redis_sms_key, 300)

	// 返回数据
	resData := make(map[string]interface{})
	resStr := gjson.Get(sendMesRes, "body").String()
	resMap := make(map[string]interface{})
	json.Unmarshal([]byte(resStr), &resMap)
	resData["res"] = resMap

	return server.ResponseJson(resData)
}

// 验证短信
func CheckSms(post map[string][]string) interface{} {

	httpData := make(map[string]string)

	// 手机号
	if post["phoneNum"] == nil || len(post["phoneNum"][0]) == 0 {
		return server.ResponseErr(6000)
	}
	// 模版
	if post["tpl"] == nil || len(post["tpl"][0]) == 0 {
		return server.ResponseErr(6000)
	}
	// 验证码
	if post["code"] == nil || len(post["code"][0]) == 0 {
		return server.ResponseErr(6000)
	}

	// 接收数据
	httpData["phoneNum"] = post["phoneNum"][0]
	httpData["tpl"] = post["tpl"][0]
	httpData["code"] = post["code"][0]

	// 配置文件名
	systemInfo := "system.json"
	// 获取配置信息
	system := server.GetFile(systemInfo)
	// redis前缀
	redis_prefix := gjson.Get(system, "core.redis_prefix").String()

	// 验证
	redigo := db.Redis()
	redis_sms_key := redis_prefix + "_sms_tpl_" + httpData["tpl"] + "_" + httpData["phoneNum"]
	redisSms, _ := redigo.Do("Get", redis_sms_key)
	redisSmsStr, _ := redis.String(redisSms, nil)
	if len(redisSmsStr) != 4 || redisSmsStr != httpData["code"] {
		return server.ResponseErr(8002)
	}

	// 删除验证码
	redigo.Do("DEL", redis_sms_key)

	// 返回数据
	resData := make(map[string]interface{})
	resData["res"] = httpData["code"]

	return server.ResponseJson(resData)
}
